在 Golang 中,所有型別都實現了 interface{} 這個介面。因此,無論是基本型別(如 string, int)還是自定義型別,都可以被當作 interface{} 進行操作。
當一個值作為 interface{} 類型傳入時,需要進行型別斷言才能恢復其原始型別。
func funcName(a interface{}) string {
return string(a) // 會出錯,需要型別斷言
}
var a interface{}
fmt.Println("Hi, I am ", a.(string))
從介面值中提取指定的型別。
語法:
value.(typeName)。
"comma, ok" idiom
語法:
str, ok := value.(string)。
範例 :
value, ok := a.(string)
if !ok {
fmt.Println("It's not ok for type string")
return
}
fmt.Println("The value is ", value)
value, ok := a.(string) 這種語法中的 ok 是固定的用法,但並不是說只能使用 ok 這個名稱。
這裡的 ok 是一個慣例用法,表示型別斷言是否成功。
這種語法會回傳兩個值:
第一個值(在此例中是 value)是型別斷言的結果。
第二個值(在此例中是 ok)是一個布林值,表示斷言是否成功。如果成功,ok 會是 true,並且 value 會是被斷言的值。如果斷言失敗,ok 會是 false,且 value 會是那個型別的零值。
你可以使用其他的變數名稱替代 ok,例如:
範例
package main
import (
"fmt"
)
func main() {
var i interface{}
// 讓 i = 42, 它是 int 型別
i = 42
checkType(i)
// 讓 i = "hello", 它是 string 型別
i = "hello"
checkType(i)
// 讓 i = true, 它是 bool 型別
i = true
checkType(i)
}
func checkType(t interface{}) {
switch v := t.(type) {
case int:
fmt.Printf("%v is an int\n", v)
case string:
fmt.Printf("%v is a string\n", v)
case bool:
fmt.Printf("%v is a bool\n", v)
default:
fmt.Printf("The type of %v is %T\n", v, v)
}
}
以上就是有關型別斷言~